package com.syl.qianyin.spider.exend;

import com.syl.framework.frametools.utils.RedisObjectUtils;
import com.syl.qianyin.spider.beans.IpProxyBean;
import com.syl.qianyin.spider.constants.RedisKeyConstant;
import com.syl.qianyin.spider.service.XiCiIPSpiderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.proxy.Proxy;
import us.codecraft.webmagic.proxy.ProxyProvider;

import java.util.ArrayList;
import java.util.List;

/**
 * 动态代理池实现 注意 必须配合 CustomHttpClientDownloader 才能有效果
 *
 * @author syl
 * @create 2019-05-11 18:10
 **/
@Component
public class DynamicProxyProvider implements ProxyProvider{
    private static final Logger LOG = LoggerFactory.getLogger(DynamicProxyProvider.class);

    private static List<Integer> SWITCH_STATE = new ArrayList<>();
    static {
        SWITCH_STATE.add(403);
        SWITCH_STATE.add(503);
    }

    @Autowired
    private RedisObjectUtils redisObjectUtils;
    @Autowired
    private XiCiIPSpiderService xiCiIPSpiderService;

    /**
     * 这个方法已经被魔改掉了
     * 现在这个方法主要做 请求头伪造 和 简单的反反爬虫规则策略
     * @param proxy
     * @param page 这里面目前有用的信息就只有 url
     * @param task 这里可以魔改Site信息
     */
    @Override
    public void returnProxy(Proxy proxy, Page page, Task task) { // 页面下载后一定会调用 前提配置了ProxyProvider
        // 取消在这里对ip池进行增加操作, 更改为车轮模式 永远不会获取不到ip
//        task.getSite().s

//        task.getSite().addHeader("X-Forwarded-For", ipBean.getIp());

//        LOG.debug("页面状态 {} 代理 {} 地址 {}", page.getStatusCode(), proxy, page.getUrl().get());
//        if(SWITCH_STATE.contains(page.getStatusCode())){
//            // 开始切换ip
//            IpProxyBean ipBean = null;
//            int i = 0;
//            while (i < 2) { // 从ip池中可能取不到值 最多重新抓取添加1次
//                ipBean = redisObjectUtils.leftPopListCache(RedisKeyConstant.MAP_IP_POO_UNCONFIRMED, IpProxyBean.class);
//                LOG.debug("从ip池中取到的 ipBean {}", ipBean);
//                if(ipBean == null) { // 当ip bean为空 说明ip 代理池已经用完 再次添加
//                    xiCiIPSpiderService.start();
//                    i++;
//                }else
//                    break;
//            }
//            LOG.debug("设置下次请求使用的代理对象 {}", ipBean);
//            redisObjectUtils.setCache(RedisKeyConstant.CURRENT_AGENT_IP_KEY, ipBean);
//        }

    }

    @Override
    public Proxy getProxy(Task task) { // 下载页面时获取代理 不使用代理时返回空
        IpProxyBean ipBean = redisObjectUtils.rollGetListCache(RedisKeyConstant.MAP_IP_POO_VALID, IpProxyBean.class);
        if (ipBean == null) {
            LOG.debug("ip 代理池正在更新中 暂时不使用代理");
            return null;
        }
        LOG.info("自动切换代理 ip {} 端口 {}", ipBean.getHost(), ipBean.getPort());
        return new Proxy(ipBean.getHost(),ipBean.getPort());
    }

}
